home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DATETIME.SWG / 0040_Get Native DOS Date-Time.pas < prev    next >
Pascal/Delphi Source File  |  1994-02-15  |  9KB  |  372 lines

  1. { COUNTRY.PAS -- Going native with Dos.  Do not use under DOS 2.xx.
  2.   Written by Wilbert van Leijen and released into the Public Domain }
  3.  
  4. Unit Country;
  5.  
  6. Interface
  7. uses Dos;
  8.  
  9. Type
  10.   DelimType    = Record
  11.                    thousands,
  12.                    decimal,
  13.                    date,
  14.                    time        : Array[0..1] of Char;
  15.                  end;
  16.   CurrType     = (leads,               { symbol precedes value }
  17.                   trails,              { value precedes symbol }
  18.                   leads_,              { symbol, space, value }
  19.                   _trails,             { value, space, symbol }
  20.                   replace);            { replaced }
  21.   CountryType  = Record
  22.                    DateFormat  : Word;       { 0: USA, 1: Europe, 2: Japan }
  23.                    CurrSymbol  : Array[0..4] of Char;
  24.                    Delimiter   : DelimType;  { Separators }
  25.                    CurrFormat  : CurrType;   { Way currency is formatted }
  26.                    CurrDigits  : Byte;       { Digits in currency }
  27.                    Clock24hrs  : Boolean;    { True if 24-hour clock }
  28.                    CaseMapCall : Procedure;  { Lookup table for ASCII ≥ $80 }
  29.                    DataListSep : Array[0..1] of Char;
  30.                    CountryCode : Word;
  31.                  end;
  32.   UpCaseType   = Function(c : Char) : Char;
  33.   UpCaseStrType = Procedure(Var s : String);
  34.  
  35. Var
  36.   UpCase       : UpCaseType;       { To be determined at runtime }
  37.   UpCaseStr    : UpCaseStrType;
  38.   CountryOk    : Boolean;          { Could determine country code flag }
  39.   CountryRec   : CountryType;
  40.  
  41. Procedure GetSysTime(Var Today : DateTime);
  42. Procedure SetSysTime(Today : DateTime);
  43.  
  44. Function DateString(FileStamp : DateTime) : String;
  45. Function TimeString(FileStamp : DateTime) : String;
  46.  
  47. Implementation
  48.  
  49. {$R-,S-,V- }
  50.  
  51. { Country dependent character capitalisation for DOS 3 }
  52.  
  53. Function UpCase3(c : Char) : Char; Far; Assembler;
  54.  
  55. ASM
  56.         MOV    AL, c
  57.         CMP    AL, 'a'
  58.         JB     @2
  59.         CMP    AL, 'z'
  60.         JA     @1
  61.         AND    AL, 11011111b
  62.         JMP    @2
  63. @1:     CMP    AL, 80h
  64.         JB     @2
  65.         CALL   [CountryRec.CaseMapCall]
  66. @2:
  67. end;  { UpCase3 }
  68.  
  69. { Country dependent string capitalisation for DOS 3 }
  70.  
  71. Procedure UpCaseStr3(Var s : String); Far; Assembler;
  72.  
  73. ASM
  74.         CLD
  75.         LES    DI, s
  76.         XOR    AX, AX
  77.         MOV    AL, ES:[DI]
  78.         STOSB
  79.         XCHG   AX, CX
  80.         JCXZ   @4
  81.  
  82. @1:     MOV    AL, ES:[DI]
  83.         CMP    AL, 'a'
  84.         JB     @3
  85.         CMP    AL, 'z'
  86.         JA     @2
  87.         AND    AL, 11011111b
  88.         JMP    @3
  89. @2:     CMP    AL, 80h
  90.         JB     @3
  91.         CALL   [CountryRec.CaseMapCall]
  92. @3:     STOSB
  93.         LOOP   @1
  94. @4:
  95. end;  { UpCaseStr3 }
  96.  
  97. { Country dependent character capitalisation for DOS 4+ }
  98.  
  99. Function UpCase4(c : Char) : Char; Far; Assembler;
  100.  
  101. ASM
  102.         MOV    DL, c
  103.         MOV    AX, 6520h
  104.         INT    21h
  105.         MOV    AL, DL
  106. end;  { UpCase4 }
  107.  
  108. { Country dependent string capitalisation for DOS 4+ }
  109.  
  110. Procedure UpCaseStr4(Var s : String); Far; Assembler;
  111.  
  112. ASM
  113.         PUSH   DS
  114.         CLD
  115.         XOR    AX, AX
  116.         LDS    SI, s
  117.         LODSB
  118.         XCHG   AX, CX
  119.         JCXZ   @1
  120.  
  121.         MOV    DX, SI
  122.         MOV    AX, 6521h
  123.         INT    21h
  124. @1:     POP    DS
  125. end;  { UpCaseStr4 }
  126.  
  127. { Return system time in Today }
  128.  
  129. Procedure GetSysTime(Var Today : DateTime); Assembler;
  130.  
  131. ASM
  132.         LES    DI, Today
  133.         CLD
  134.  
  135.         MOV    AH, 2Ah
  136.         INT    21h
  137.         XCHG   AX, CX          { year }
  138.         STOSW
  139.         XOR    AH, AH
  140.         MOV    AL, DH          { month }
  141.         STOSW
  142.         MOV    AL, DL          { day }
  143.         STOSW
  144.  
  145.         MOV    AH, 2Ch
  146.         INT    21h
  147.         XOR    AH, AH
  148.         MOV    AL, CH          { hours }
  149.         STOSW
  150.         MOV    AL, CL          { min }
  151.         STOSW
  152.         MOV    AL, DH          { seconds }
  153.         STOSW
  154. end;  { GetSysTime }
  155.  
  156. { Set system time }
  157.  
  158. Procedure SetSysTime(Today : DateTime); Assembler;
  159.  
  160. ASM
  161.         PUSH   DS
  162.         CLD
  163.         LDS    SI, Today
  164.         LODSW
  165.         MOV    CX, AX          { year }
  166.         LODSW
  167.         MOV    DH, AL          { month }
  168.         LODSW
  169.         MOV    DL, AL          { day }
  170.         MOV    AH, 2Bh
  171.         INT    21h
  172.  
  173.         LODSW                  
  174.         MOV    CH, AL          { hour }
  175.         LODSW
  176.         MOV    CL, AL          { minutes }
  177.         LODSW
  178.         MOV    DH, AL          { seconds }
  179.         XOR    DL, DL
  180.         MOV    AH, 2Dh
  181.         INT    21h
  182.         POP    DS
  183. end;  { SetSysTime }
  184.  
  185. { Convert a binary number to an unpacked decimal
  186.   On entry:  AL <-- number ≤ 99
  187.   On exit:   AX --> ASCII representation }
  188.  
  189. Procedure UnpackNumber; Assembler;
  190.  
  191. ASM
  192.         AAM
  193.         XCHG    AH, AL
  194.         ADD     AX, '00'
  195. end;  { UnpackNumber }
  196.  
  197. Function DateString(FileStamp : DateTime) : String; Assembler;
  198.  
  199. ASM
  200.         PUSH   DS
  201.         CLD
  202.  
  203.   { Set string length }
  204.  
  205.         LES    DI, @Result
  206.         MOV    AL, 8
  207.         STOSB
  208.  
  209.   { Store year, month and day in registers }
  210.  
  211.         LDS    SI, FileStamp
  212.         LODSW
  213.         SUB    AX, 1900
  214.         CALL   UnpackNumber
  215.         XCHG   AX, BX              { yy -> BX }
  216.         LODSW
  217.         CALL   UnpackNumber
  218.         XCHG   AX, CX              { mm -> CX }
  219.         LODSW
  220.         CALL   UnpackNumber
  221.         XCHG   AX, DX              { dd -> DX }
  222.  
  223.   {  Case date format of
  224.        0 : USA standard       mm:dd:yy
  225.        1 : Europe standard    dd:mm:yy
  226.        2 : Japan standard     yy:mm:dd }
  227.  
  228.         POP    DS
  229.         MOV    AL, Byte Ptr [CountryRec.DateFormat]
  230.         OR     AL, AL
  231.         JZ     @1
  232.         DEC    AL
  233.         JZ     @2
  234.  
  235.   { Japan }
  236.  
  237.         PUSH   DX
  238.         PUSH   CX
  239.         PUSH   BX
  240.         JMP    @3
  241.  
  242.   { USA }
  243.  
  244. @1:     PUSH   BX
  245.         PUSH   DX
  246.         PUSH   CX
  247.         JMP    @3
  248.  
  249.   { Europe }
  250.  
  251. @2:     PUSH   BX
  252.         PUSH   CX
  253.         PUSH   DX
  254.  
  255.   { Remove leading zero }
  256.  
  257. @3:     POP    AX
  258.         CMP    AL, '0'
  259.         JNE    @4
  260.         MOV    AL, ' '
  261.  
  262. @4:     MOV    CL, Byte Ptr [CountryRec.Delimiter.date]
  263.         STOSW
  264.         MOV    AL, CL
  265.         STOSB
  266.         POP    AX
  267.         STOSW
  268.         MOV    AL, CL
  269.         STOSB
  270.         POP    AX
  271.         STOSW
  272. end;  { DateString }
  273.  
  274. Function TimeString(FileStamp : DateTime) : String; Assembler;
  275.  
  276. ASM
  277.         PUSH   DS
  278.         CLD
  279.  
  280.         MOV    BL, [CountryRec.Clock24Hrs]
  281.         MOV    DX, [CountryRec.Delimiter.time]
  282.         LDS    SI, FileStamp
  283.         LES    DI, @Result
  284.  
  285.   { Set string length }
  286.  
  287.         MOV    AL, 5
  288.         STOSB
  289.  
  290.   { Advance string index of FileStamp to hour field }
  291.  
  292.         ADD    SI, 6
  293.         LODSW
  294.  
  295.   { Query time format }
  296.  
  297.         OR     BL, BL
  298.         JNZ    @2
  299.  
  300.   { a.m. / p.m. clock format, set string length to 6 }
  301.  
  302.         INC    Byte Ptr ES:[DI-1]
  303.         MOV    BL, 'a'
  304.         CMP    AL, 12
  305.         JBE    @1
  306.         SUB    AL, 12
  307.         MOV    BL, 'p'
  308. @1:     MOV    Byte Ptr ES:[DI+5], BL
  309.  
  310.   { Convert to ASCII and remove leading zero }
  311.  
  312. @2:     CALL   UnpackNumber
  313.         CMP    AL, '0'
  314.         JNE    @3
  315.         MOV    AL, ' '
  316. @3:     STOSW
  317.  
  318.   { Write time separator }
  319.  
  320.         XCHG   AX, DX
  321.         STOSB
  322.  
  323.   { Store minutes in string }
  324.  
  325.         LODSW
  326.         CALL   UnpackNumber
  327.         STOSW
  328.  
  329.         POP    DS
  330. end;  { TimeString }
  331.  
  332. Begin  { Country }
  333. ASM
  334.  
  335.    { Exit if Dos version < 3.0 }
  336.  
  337.         MOV    AH, 30h
  338.         INT    21h
  339.         CMP    AL, 3
  340.         JB     @3
  341.         JA     @1
  342.  
  343.    { Initialise pointers to DOS 3 capitalisation routines }
  344.  
  345.         MOV    Word Ptr [UpCase], Offset UpCase3
  346.         MOV    Word Ptr [UpCaseStr], Offset UpCaseStr3
  347.         JMP    @2
  348.  
  349.    { Initialise pointers to DOS 4 (or later) capitalisation routines }
  350.  
  351. @1:     MOV    Word Ptr [UpCase], Offset UpCase4
  352.         MOV    Word Ptr [UpCaseStr], Offset UpCaseStr4
  353.  
  354. @2:     MOV    Word Ptr [UpCase+2], CS
  355.         MOV    Word Ptr [UpCaseStr+2], CS
  356.  
  357.    { Call Dos 'Get country dependent information' function }
  358.  
  359.         MOV    AX, 3800h
  360.         MOV    DX, Offset [CountryRec]
  361.         INT    21h
  362.         JC     @3
  363.  
  364.    { Add country code to the structure }
  365.  
  366.         MOV    [CountryRec.CountryCode], BX
  367.         MOV    [CountryOk], True
  368.         JMP    @4
  369. @3:     MOV    [CountryOk], False
  370. @4:
  371. end;
  372. end.  { Country }